﻿using FlyingHat.Model.Models.Global;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace FlyingHat.Extensions.Filter
{
    public class ModelValidateFilter : IAsyncActionFilter
    {
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            if (!context.ModelState.IsValid)
            {
                //获取验证失败的模型字段   
                // 此验证会验证任何参数，因此这个方法还是有局限性，不够自由
                var errors = new List<string>();
                foreach (var item in context.ModelState)
                {
                    if (item.Value != null)
                    {
                        foreach (var error in item.Value.Errors)
                        {
                            errors.Add(error.ErrorMessage);
                        }
                    }
                }
                var str = string.Join("|", errors);
                // 因为请求方式有很多不同，因此一律返回Json并不是一个好结果。除非是API项目
                // 因此我们要寻找用于区分的方法
                // 可以根据请求头中的 x-requested-with 判断是否是ajax请求，或者自行增加特殊标识用于区分页面请求和ajax请求
                // 根据请求不同，返回不同结果
                var ajax = context.HttpContext.Request.Headers.ContainsKey("x-requested-with");
                if (ajax)
                {
                    context.Result = new JsonResult(ReturnModel.Fail(str));
                }
                else
                {
                    context.Result = new RedirectToActionResult("Error", "Error", new { error = str });
                }
            }
            else
            {
                await next();
            }
        }
    }
}
